AR功能 Sample详情

最后更新时间:2019年6月17日

功能介绍

增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。

MapGIS Mobile 10.3 for Android将移动AR技术与GIS可视化技术相结合,提供AR增强现实功能,利用图像跟踪技术,用户无需键盘、鼠标操作与触摸屏幕,以自然的方式去观察该模型,给用户带来沉浸式的体验。MapGIS Mobile提供的AR功能由三维场景模块和定位模块集成而来,将三维虚拟场景与现实场景融合,展示现实与虚拟信息,达到超越现实的感官体验。可以应用到国土行业的土地执法监察、公安行业的民警巡逻、市政管网巡检等应用场景中。

功能接口

AR功能的实现方法主要由API程序包com.zondy.mapgis.android.sceneview中的FirstPersonSceneManipulator第一人称场景操作器类、SceneView三维场景视图类、com.zondy.mapgis.android.ar程序包中的DeviceMotionDataSourceLBS设备姿态数据源类、VideoSourceDefault视频源类等提供。核心接口如下:

接口 说明
setDeviceMotionDataSource() 设置设备姿态数据源
initialize() 初始化
startAR() 开始AR功能
stopAR() 结束AR功能
接口 说明
setManipulator() 设置操作器
接口 说明
setDestCoordinateType() 设置目标坐标类型
setAltitudeOffset() 设置高程偏移
接口 说明
setDestCoordinateType() 设置目标坐标类型
setAltitudeOffset() 设置高程偏移

实现方法

AR功能的实现步骤如下所示:

(1)构建设备姿态数据源:实例化DeviceMotionDataSourceLBS对象,并设置目标坐标类型、高程偏移等信息。设备姿态数据源,为AR功能提供设备的位置信息。

(2)构建视频源:实例化VideoSourceDefault对象,根据需要设置相机标定文件路径。视频源,用于AR获取视频信息,即打开摄像头后捕捉到的视频。

(3)构造并开启第一人称场景操作器:实例化FirstPersonSceneManipulator对象,并将设备姿态数据源、视频源对象赋予给第一人称场景操作器,并进行初始化,完成后将其赋予给SceneView场景视图对象。

(4)开启AR:调用startAR()方法开启AR。

说明:在实现AR功能之前,必须确保应用程序具备进行精确定位、开启照相机的权限。需要为工程声明权限的使用,在AndroidManifest.xml清单文件中添加以下权限标签说明,并且需要声明使用相机所具有的特性:

<!-- 允许应用程序访问精确位置,通过GPS进行定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 允许应用程序访问近似位置,通过网络进行定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 开启相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera"/>
<!-- 相机的自动对焦功能 -->
<uses-feature android:name="android.hardware.camera.autofocus"/>

实现过程

1

构建设备姿态数据源

MapGIS Mobile提供的AR功能效果为:在设备开启摄像头后,在当前展示的视图中融合显示虚拟的三维场景信息,达到增强现实的效果。根据功能效果的特性,需要获取设备当前的位置信息,所以需要构造设备姿态数据源对象,并设置目标坐标类型、高程偏移,程序内部会根据参数自动获取位置信息,提供给AR功能。

//设备姿态数据源对象
DeviceMotionDataSourceLBS deviceMotionDataSourceLBS = new DeviceMotionDataSourceLBS(getApplicationContext());
deviceMotionDataSourceLBS.setDestCoordinateType(LocationCoordType.COORD_TYPE_GCJ02_LonLat); //设置目标坐标类型
deviceMotionDataSourceLBS.setAltitudeOffset(1.7); //设置高程偏移

2

构建视频源

AR,即增强现实,是在现实场景中叠加显示虚拟信息,所以当然需要获取设备摄像头所捕获到的视频信息。构建视频源信息,也即是此作用。开发者也可以根据实际需要设置相机标定文件来对视频进行矫正。

//视频源对象
VideoSourceDefault mVideoSourceDefault = new VideoSourceDefault(AR_Activity.this);
mVideoSourceDefault.setCameraClibPath(Environment.getExternalStorageDirectory().getPath() + "/MapGIS Mobile 3D Sample/AR/VideoSourceConfig/cameraParameters_1920x1080.xml"); //设置相机标定文件路径

3

构造并开启第一人称场景操作器

对于三维场景视图,支持通过两种模式来操作场景,对应两种场景操作器:

支持多种交互手势来实现对地图的控制

构造第一人称场景操作器FirstPersonSceneManipulator对象,并将前面两个步骤中构造的设备姿态数据源、视频源赋予给它。

//第一人称场景操作器
FirstPersonSceneManipulator mFirstPersonSceneManipulator = new FirstPersonSceneManipulator();
//设置设备姿态数据源
mFirstPersonSceneManipulator.setDeviceMotionDataSource(deviceMotionDataSourceLBS);
//设置视频源
mFirstPersonSceneManipulator.setVideoSource(mVideoSourceDefault);

信息设置完成后,需调用initialize方法初始化,并在成功回调函数中将第一人称场景操作器赋予给SceneView场景视图对象。

//初始化
mFirstPersonSceneManipulator.initialize(new FirstPersonSceneManipulator.InitializeCallback() {
    @Override
    public void onInitializeStart() {
        //开始初始化第一人称触摸操作器
    }

    @Override
    public void onInitializeFinish(int i) {
        if (i == 0) {
            //初始化成功
            //设置第一人称场景操作器
            int result = mSceneView.setManipulator(mFirstPersonSceneManipulator);
            if (result == 1) {
                //设置第一人称场景操作器成功
            }
        } else { 
            //初始化失败
        }
    }
});

在为场景视图设置了第一人称场景操作器后,三维场景视图的展示模式会发生变化,由用户手势操作改变场景展示的模式,变换为根据设备的当前朝向、俯仰角等信息来改变场景的展示内容,场景会跟随设备的转动、移动来改变显示内容,给用户带来沉浸式的体验。展示效果如下图所示:

AR多点触摸操作器.jpg
AR第一人称场景操作器.jpg


4

开启AR

将场景视图的操作器设置为第一人称场景操作器后,即可开启AR功能。

//开启AR
int startResult = mFirstPersonSceneManipulator.startAR();

开启AR后,场景视图中展示的内容也会发生改变,视图中会展示设备的摄像头所拍摄的图像,如果在场景中加载了地图覆盖物、倾斜摄影模型等三维数据,就会在视图中同时看到真实世界的拍摄视图,也可以看到三维数据。

如果需要停止AR,调用如下代码:

//停止AR
int stopResult = mFirstPersonSceneManipulator.stopAR();

实现效果如下图所示:

0103开启AR.jpg